package com.holly.unit.query.util;

import cn.hutool.core.util.StrUtil;
import com.holly.unit.auth.api.context.LoginContext;
import com.holly.unit.auth.api.pojo.login.LoginUser;
import com.holly.unit.core.util.HttpServletUtil;
import com.holly.unit.db.api.constants.DataBaseConstants;
import com.holly.unit.query.pojo.SysUser;
import com.holly.unit.query.pojo.SysUserCacheInfo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 类描述: JWT工具类
 *
 * @author fxr
 * @version 1.0.0
 * @date 2022/4/6 16:14
 */
public class JwtUtil {

    /**
     *  从session中获取变量
     * @param key
     * @return
     */
    public static String getSessionData(String key) {
        //${myVar}%
        //得到${} 后面的值
        String moshi = "";
        if(key.indexOf("}")!=-1){
            moshi = key.substring(key.indexOf("}")+1);
        }
        String returnValue = null;
        if (key.contains("#{")) {
            key = key.substring(2,key.indexOf("}"));
        }
        if (StrUtil.isNotEmpty(key)) {
            HttpServletRequest request = HttpServletUtil.getRequest();
            HttpSession session = request.getSession();
            returnValue = (String) session.getAttribute(key);
        }
        //结果加上${} 后面的值
        if(returnValue!=null){returnValue = returnValue + moshi;}
        return returnValue;
    }

    /**
     * 从当前用户中获取变量
     * @param key
     * @param user
     * @return
     */
    //TODO 急待改造 sckjkdsjsfjdk
    public static String getUserSystemData(String key,SysUserCacheInfo user) {
        if(user==null) {
            user = DataAutorUtil.loadUserInfo();
        }
        //#{sys_user_code}%

        // 获取登录用户信息
        LoginUser loginUser = LoginContext.me().getLoginUser();
        // 把loginUser  To sysUser
        // LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        SysUser sysUser = LoginUserToSysUserUtil.loginUserToSysUser(loginUser);


        String moshi = "";
        if(key.indexOf("}")!=-1){
            moshi = key.substring(key.indexOf("}")+1);
        }
        String returnValue = null;
        //针对特殊标示处理#{sysOrgCode}，判断替换
        if (key.contains("#{")) {
            key = key.substring(2,key.indexOf("}"));
        } else {
            key = key;
        }
        //替换为系统登录用户帐号
        if (key.equals(DataBaseConstants.SYS_USER_CODE)|| key.toLowerCase().equals(DataBaseConstants.SYS_USER_CODE_TABLE)) {
            if(user==null) {
                returnValue = sysUser.getUsername();
            }else {
                returnValue = user.getSysUserCode();
            }
        }
        //替换为系统登录用户真实名字
        else if (key.equals(DataBaseConstants.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstants.SYS_USER_NAME_TABLE)) {
            if(user==null) {
                returnValue = sysUser.getRealname();
            }else {
                returnValue = user.getSysUserName();
            }
        }

        //替换为系统用户登录所使用的机构编码
        else if (key.equals(DataBaseConstants.SYS_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstants.SYS_ORG_CODE_TABLE)) {
            if(user==null) {
                returnValue = sysUser.getOrgCode();
            }else {
                returnValue = user.getSysOrgCode();
            }
        }
        //替换为系统用户所拥有的所有机构编码
        else if (key.equals(DataBaseConstants.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstants.SYS_MULTI_ORG_CODE_TABLE)) {
            if(user.isOneDepart()) {
                returnValue = user.getSysMultiOrgCode().get(0);
            }else {

                List<String> list = user.getSysMultiOrgCode();
                // 逗号隔开
                returnValue = handle(list);
                //returnValue = Joiner.on(",").join(user.getSysMultiOrgCode());
            }
        }
        //替换为当前系统时间(年月日)
        else if (key.equals(DataBaseConstants.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstants.SYS_DATE_TABLE)) {
            returnValue = user.getSysDate();
        }
        //替换为当前系统时间（年月日时分秒）
        else if (key.equals(DataBaseConstants.SYS_TIME)|| key.toLowerCase().equals(DataBaseConstants.SYS_TIME_TABLE)) {
            returnValue = user.getSysTime();
        }
        //流程状态默认值（默认未发起）
        else if (key.equals(DataBaseConstants.BPM_STATUS)|| key.toLowerCase().equals(DataBaseConstants.BPM_STATUS_TABLE)) {
            returnValue = "1";
        }
        if(returnValue!=null){returnValue = returnValue + moshi;}
        return returnValue;
    }


    private static String handle(List<String> list) {
        StringBuilder sb = new StringBuilder();
        if (list == null || list.size() == 0) {
            return null;
        }
        for (int i=0;i<list.size();i++) {
            String orgCode = list.get(i);
            if (i != list.size()-1) {
                sb.append(orgCode);
                sb.append(",");
            } else {
                sb.append(orgCode);
            }
        }

        return sb.toString();
    }


}
